Jerry's Log

group by

contents

다음은 GROUP BY 와, GROUP BY 내에서 MAX 함수와 CASE이 어떻게 함께 작동하는지에 대한 설명입니다.


1. 기초: GROUP BY란 무엇인가?

SQL에서 GROUP BY는 동일한 데이터를 가진 행(Row)들을 하나의 그룹으로 묶어주는 역할을 합니다.

시각적 비유:

M&M 초콜릿 봉지가 있다고 상상해 보세요.


2. GROUP BYMAX() (기본 사용법)

GROUP BY와 함께 MAX() 같은 집계 함수를 쓰면, 함수는 각 그룹마다 새로 시작됩니다.

상황: Salaries(급여) 테이블이 있습니다.

부서    | 직원     | 급여
--------|----------|-------
IT      | 철수     | 100
IT      | 영희     | 120  <-- IT 부서의 최대값
인사    | 민수     | 90
인사    | 수진     | 95   <-- 인사 부서의 최대값

쿼리:

SELECT 부서, MAX(급여) 
FROM Salaries 
GROUP BY 부서;

결과:


3. 심화: MAX 내부의 CASE

이것이 가장 흥미로운 부분입니다. 이 기술은 주로 피벗(Pivot), 즉 행(Row)을 열(Column)로 바꿀 때 사용됩니다. 이를 "조건부 집계(Conditional Aggregation)"라고 합니다.

논리적 흐름 (Logic Flow)

MAX(CASE WHEN ... END)를 작성하면, 데이터베이스는 각 그룹에 대해 두 단계의 작업을 수행합니다.

  1. 1단계 (CASE 문): 그룹 내의 모든 행을 세로로 훑어내려갑니다. 조건에 맞는 값은 그대로 유지하고, 맞지 않는 값은 NULL로 바꿔버립니다.
  2. 2단계 (MAX 함수): 1단계의 결과를 봅니다. 집계 함수는 NULL을 무시하기 때문에, 필터링을 통과하고 살아남은 값 중 가장 큰 값을 선택합니다.

상세 예시: "학생 성적표" 문제

TestResults 테이블:

학생 과목 점수
철수 수학 90
철수 과학 85
영희 수학 95
영희 과학 80

우리는 학생당 한 줄만 나오게 하고, 수학과 과학을 별도의 열(Column)로 만들고 싶습니다.

쿼리:

SELECT 
    Student,
    MAX(CASE WHEN Subject = 'Math' THEN Score ELSE NULL END) AS Math_Score,
    MAX(CASE WHEN Subject = 'Science' THEN Score ELSE NULL END) AS Science_Score
FROM TestResults
GROUP BY Student;

엔진 내부 실행 과정 (슬로우 모션)

'철수' 그룹을 처리하는 과정을 봅시다:

단계 A: 수학(Math)을 위한 CASE 처리

단계 B: 수학을 위한 MAX 처리

단계 C: 과학(Science)을 위한 CASE 처리

단계 D: 과학을 위한 MAX 처리

최종 결과:

학생 Math_Score Science_Score
철수 90 85
영희 95 80

4. 왜 SUM 대신 MAX를 쓰나요?

이 패턴에서 MAXSUM이 혼용되는 것을 자주 볼 수 있습니다.

값이 하나뿐인 경우 MAX(90)은 90이고, SUM(90)도 90이므로 결과는 동일합니다. 하지만 의미적으로 "값 추출"에는 MAX가 더 자주 쓰입니다.

references